#ifndef ESTRATEGIAALMACENAMIENTOBLOQUES_H_
#define ESTRATEGIAALMACENAMIENTOBLOQUES_H_

#include "EstrategiaAlmacenamiento.h"
#include "../Constantes.h"

#include <string>

using namespace std;

/*
 * Funcion: Estrategia que organiza el almacenamiento en bloques.
 */

class EstrategiaAlmacenamientoBloques: public EstrategiaAlmacenamiento {

	friend class IteradorBloques;


private:
	cantBytes tamanioBloque;
	void completarHeader(Bytes& header);

public:

	/*
	 * Pre: -
	 * Pos: crea una nueva instancia.
	 */
	EstrategiaAlmacenamientoBloques(cantBytes tamanioBloque,FabricaCompuestos* fabrica);

	/*
	 * Pre: -
	 * Pos: Libera los recursos instanciados.
	 */
	virtual ~EstrategiaAlmacenamientoBloques();

	/*
	 * Pre: -
	 * Pos: devuelve si el header esta corrupto.
	 */
	bool headerCorrupto();

	/*
	 * Pre: numero de componente valido.
	 * Pos: Guarda los bytes en el componente
	 */
	virtual bool guardar(const Bytes& bytes, long& numeroComponente);

	/*
	 * Pre: numero de componente valido.
	 * Pos: devuelve los bytes del dato relacionado con la clave.
	 */
	virtual Bytes obtener(offset numeroComponente, Key clave = Key(), TipoClave* extractor = NULL);

	/*
	 * Pre: numero de componente valido.
	 * Pos: elimina el dato relacionado con la clave.
	 */
	virtual bool eliminar(offset numeroComponente, Key clave = Key(), TipoClave* extractor = NULL);

	virtual Iterador* getIterador();
};

#endif /* ESTRATEGIAALMACENAMIENTOBLOQUES_H_ */
